/**
 *@file main.c
 *
 *@brief Principal arquivo do projeto.
 *
 *@details Contém includes para todos os outros arquivos
 * do projeto e as principais variáveis globais. Também
 * tem a função main.
 *
 *@author Copyright 2009 Daniel
 *\n
 *This program is Free Software, distributed under the
 * terms of the GNU General Public License, published
 * by the Free Software Foundation; version 3 or any
 * later version published by the Free Software
 * Foundation, at your choice.
 *
 *@todo Maze Generator
 *\n
 * Pathfinder
 *\n
 * sistema de eventos
 */

/**
 *@addtogroup Chuck_Norris
 *@{
 */

#include "include/include.h"

/**
 *@brief O mapa
 */
Tile_t mapa[25][20];
/**
 *@brief Usado para finalizar o thread gfx_thread
 *@details Exemplo:
 *@code
 * gfx_feche = TRUE;
 * SDL_WaitThread(gfx_thread,NULL);
 * @endcode
 */
extern Bool_t gfx_feche;
/**
 *@brief Usado para finalizar o PATH Finder
 *@details Exemplo:
 *@code
 * pf_feche = TRUE;
 * SDL_WaitThread(pf_thread,NULL);
 * @endcode
 *@see gfx_feche
 */
extern Bool_t pf_feche;
/**
 *@brief Usado para gato
 *@details Não modifique esse ponteiro, pois
 * o programa usa módulos que rodam em paralelo
 * e problemas vão ocorrer se você arbritariamente
 * modificar esse ponteiro. Esse ponteiro só deve
 * ser modificado pela função init_map. \n
 * Para usar esse ponteiro faça algo como:
 *@code
 * struct Anima * aux = gato;
 * if(gato == NULL)
 *  return;
 * //...
 * @endcode
 * e use as funções de manipulação de Animas.
 *@see Anima
 */
struct Anima * gato = NULL;
/**
 *@brief Usado para o cozinheiro
 *@see Anima gato
 */
struct Anima * cozinheiro = NULL;

/**
 *@brief Usado para controlar o thread
 * da função gfx_main.
 *@details Deve ser usada só, e somente
 * só, pelo módulo gráfico e pelo
 * módulo Chuck_Norris.
 */
SDL_Thread * gfx_thread = NULL;

/**
 *@brief Usado para controlar o thread
 * do pathfinder.
 */
SDL_Thread * pf_thread = NULL;

SDL_Thread * menu_thread = NULL;


//
//Quando entrar no mapa, a parte principal do jogo,
//pathfinder e sistema gráfico precisarão ser chamados.
//
//Para isso, deve-se usar (com o sistema gráfico):
//if(gfx_thread == NULL){
// unsigned int frames_per_second = 25;//um exemplo, aqui você define os frames por segundo
// gfx_thread = SDL_CreateThread(gfx_main,(void *)(&frames_per_second));
//}
//
//E para finalizar:
//gfx_feche = TRUE;
//SDL_WaitThread(gfx_thread,NULL);
//gfx_thread = NULL;
//
//
//Para o do pathfinder segue a mesma lógica, porém as variáveis são:
//pf_thread
//pf_feche
//

/**
 *@brief Função principal
 *@details Estamos usando a função main no lugar
 * da função chuck porque não somos dignos de usar
 * a libchuck.
 */
int main(int argc, char **argv)
{
/**
 *@{
 */
	unsigned int fps = 25;
	SDL_Event atitudes_do_usuario;
	Tile_t (* tiletipo)[20] = mapa;

	int fechar = 0;
	int peixestotal;

	int menu2 = 1;
	int iniciou = 0;
	
	int auxiliardomenu;
	
	Bool_t musicamenu=TRUE;
	Bool_t musicajogo=TRUE;

	init();
	
	play_sound(SOM_TELA);
	intro(tela);
	pausa_musica();

	draw_menu(1, 1);
	while (!fechar)
	{
			if(menu2)
			{
                    if(musicamenu)
                    {
                                  play_sound(SOM_MENU);
                                  musicamenu = FALSE;
                    }
					menu1(&menu2, atitudes_do_usuario, &fechar, menu_thread, &auxiliardomenu);
			}
			else
			{
                    if(musicajogo)
                    {
                             pausa_musica();
                             play_sound(SOM_JOGO);
                             musicajogo = FALSE;  
                    }   
					while (SDL_PollEvent(&atitudes_do_usuario))
					{
							if (!iniciou)
							{
									init_map((Tile_t (* const)[20])(tiletipo), &peixestotal);
									gfx_thread = SDL_CreateThread(gfx_main, &fps);
									pf_thread = SDL_CreateThread(pathfinder_mestre,NULL);
									++iniciou;
							}
							movimentos(atitudes_do_usuario);
							if (atitudes_do_usuario.key.keysym.sym == SDLK_ESCAPE || atitudes_do_usuario.type == SDL_QUIT || peixescomidos == peixestotal)
							{
									fechar = 1;
							}
					}
					if(iniciou)
					{
							andando();
							andarcozinheiro();
					}
					if(!musicamenu)
					{
			                  musicamenu = TRUE; 
                              free_music(SOM_MENU);
                     } 
			}
	}
	
    free_music(SOM_JOGO);
	gfx_feche = TRUE;
	SDL_WaitThread(gfx_thread, NULL);
	gfx_thread = NULL;
	pf_feche = TRUE;
	SDL_WaitThread(pf_thread,NULL);
	pf_thread = NULL;
	exit(EXIT_SUCCESS);
/**
 *@}
 */
}

/**
 *@}
 */
